package ar.edu.utn.frba.dds.tp.ui.appModel;

import java.util.ArrayList;
import java.util.List;

import org.joda.time.LocalDate;
import org.uqbar.commons.model.ObservableUtils;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import ar.edu.utn.frba.dds.tp.code.adapter.LanchitaAdapter;
import ar.edu.utn.frba.dds.tp.code.adapter.OceanicAdapter;
import ar.edu.utn.frba.dds.tp.code.lugares.Lugar;
import ar.edu.utn.frba.dds.tp.code.vuelos.BuscadorVuelos;
import ar.edu.utn.frba.dds.tp.code.vuelos.Busqueda;
import ar.edu.utn.frba.dds.tp.code.vuelos.Vuelo;
import ar.edu.utn.frba.dds.tp.code.Asientos.AsientoDeVuelo;

@Observable
public class BusquedasManager {

	Lugar origen;
	Lugar destino;
	LocalDate fecha;
	Busqueda busqueda;
	AsientoDeVuelo asientoSeleccionado;
	
	public BusquedasManager(){
		BuscadorVuelos.getInstance().clearAerolineas();	
		new LanchitaAdapter();
		new OceanicAdapter();
	}
	
	public void clear(){
		this.origen = null;
		this.destino = null;
		this.fecha = null;
	}
	
	public Busqueda getBusqueda(){
		return this.busqueda;
	}
	

	public AsientoDeVuelo getAsientoSeleccionado() {
		return asientoSeleccionado;
	}

	public void setAsientoSeleccionado(AsientoDeVuelo asientoSeleccionado) {
		this.asientoSeleccionado = asientoSeleccionado;
	}

	
	public LocalDate getFecha() {
		return fecha;
	}

	public void setFecha(LocalDate fecha) {
		this.fecha = fecha;
	}
	
	public Lugar getOrigen() {
		return origen;
	}

	public void setOrigen(Lugar origen) {
		this.validarLugar(origen, "Origen");
		this.origen = origen;
	}

	public Lugar getDestino() {
		return destino;
	}

	public void setDestino(Lugar destino) {
		
		this.validarLugar(destino, "Destino");
		this.destino = destino;
	}
	
	public List<AsientoDeVuelo> getResultados(){
		List<AsientoDeVuelo> asientos = new ArrayList<AsientoDeVuelo>();
		
		if (this.busqueda != null){
			for(Vuelo vuelo: this.busqueda.getVuelos()){
				asientos.addAll(vuelo.getAsientos());
			}
		}
		
		return asientos;
	}
	
	private void validarLugar(Lugar lugar, String field) throws UserException{
		if(lugar.getLugar().matches(".*\\d.*"))
			throw new UserException("El campo "+ field+ " no puede contener numeros");
		if(lugar.getLugar().length() > 3)
			throw new UserException("El campo "+ field+ " es muy largo, \n Longitud maxima 3 caracteres");
	}
	
	public void buscarVuelos(){
		this.busqueda = new Busqueda(this.origen, this.destino, this.fecha);
		ObservableUtils.forceFirePropertyChanged(this,"resultados", this.getResultados());
	}
}
